Parameters

filtered_data <- read.csv("data/data-2023-09-11 (2).csv", header = TRUE)

selected_stats <- c("Ho", "Hs", "Ht", "Fis (W&C)", "Fst (W&C)", "Fis (Nei)", "Fst (Nei)"
)

n_rep=10

n_pop = 8

sequence_length <- length(6:11) 

data filtering convertion

Run basic.stats and render the result

library(pegas)
library(dplyr)
library(tibble)

result <- basic.stats(mydata_hierfstat)
df_resutl_basic<-as.data.frame(result$perloc)

# Weir and Cockrham estimates of Fstatistics - FIS and FST 
result_f_stats <- Fst(as.loci(mydata_genind), na.alleles = "")
result_f_stats <- result_f_stats[,2:3]
colnames(result_f_stats) <- c("Fst (W&C)", "Fis (W&C)")
result_f_stats <- merge(result_f_stats, df_resutl_basic, by="row.names",all.x=TRUE)
colnames(result_f_stats)[10] <- "Fst (Nei)"
colnames(result_f_stats)[12] <- "Fis (Nei)"
result_f_stats <- result_f_stats %>% column_to_rownames(., var = 'Row.names')
result_f_stats_selec <- result_f_stats %>% select(all_of(selected_stats))
result_f_stats_selec

G-statistic

library(hrbrthemes)
library(ggplot2)

# compute the Gstats
result_f_stats <- result_f_stats %>% mutate(GST = 1-Hs/Ht)
result_f_stats <- result_f_stats %>% mutate("GST''" = (n_pop*(Ht-Hs))/((n_pop*Hs-Ht)*(1-Hs)))
result_f_stats

# Plot with linear trend
p2 <- ggplot(result_f_stats, aes(x=GST, y=Hs)) +
  geom_point() +
  geom_smooth(method=lm , color="red", se=FALSE) +
  theme_ipsum()
p2

Missing data

# Libraries
library("poppr")
This is poppr version 2.9.4. To get started, type package?poppr
OMP parallel support: unavailable
library("heatmaply")
Loading required package: plotly
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout

Loading required package: viridis
Loading required package: viridisLite
Registered S3 method overwritten by 'dendextend':
  method     from 
  rev.hclust vegan
Registered S3 method overwritten by 'seriation':
  method         from 
  reorder.hclust vegan

======================
Welcome to heatmaply version 1.5.0

Type citation('heatmaply') for how to cite the package.
Type ?heatmaply for the main documentation.

The github page is: https://github.com/talgalili/heatmaply/
Please submit your suggestions and bug-reports at: https://github.com/talgalili/heatmaply/issues
You may ask questions at stackoverflow, use the r and heatmaply tags: 
     https://stackoverflow.com/questions/tagged/heatmaply
======================
missing_data <- info_table(mydata_genind, plot = FALSE)

# Matrix format
mat <- as.matrix(missing_data)
# heatmap
p <- heatmaply(mat, 
               dendrogram = "none",
               xlab = "", ylab = "", 
               main = "",
               scale = "column",
               margins = c(60,100,40,20),
               grid_color = "white",
               grid_width = 0.00001,
               titleX = FALSE,
               hide_colorbar = TRUE,
               branches_lwd = 0.1,
               label_names = c("Population", "Marker", "Value"),
               fontsize_row = 8, fontsize_col = 8,
               labCol = colnames(mat),
               labRow = rownames(mat),
               heatmap_layers = theme(axis.line=element_blank())
)
p
p

HW - Panmixia

genepop_HWtable <- HWtable_analysis(
  inputFile = "data/mydata.genepop.txt",
  which = "Proba",
  settingsFile = "",
  enumeration = FALSE,
  dememorization = 10000,
  batches = 20,
  iterations = 5000,
  verbose = interactive()
)
Error: Cannot read correctly. Check second line of input

Linkage Disequilibrium

pair.ia(mydata_genind, sample = 500, quiet = FALSE, method = 3 )

  |                                                                                                                 
  |                                                                                                           |   0%
                                                                                                                    

  |                                                                                                                 
  |                                                                                                           |   0%
  |                                                                                                                 
  |==                                                                                                         |   2%
  |                                                                                                                 
  |====                                                                                                       |   4%
                                                                                                                    
             Ia    p.Ia   rbarD    p.rD
B12:C07 -0.0039  0.9421 -0.0039  0.9421
B12:D12  0.0545  0.0020  0.0547  0.0020
B12:D10  0.0204  0.0020  0.0204  0.0020
B12:A12  0.0356  0.0020  0.0356  0.0020
B12:C03  0.0531  0.0020  0.0534  0.0020
C07:D12 -0.0233  1.0000 -0.0233  1.0000
C07:D10  0.0172  0.0020  0.0172  0.0020
C07:A12  0.0364  0.0020  0.0365  0.0020
C07:C03  0.1252  0.0020  0.1254  0.0020
D12:D10  0.0708  0.0020  0.0709  0.0020
D12:A12  0.0244  0.0020  0.0245  0.0020
D12:C03 -0.0135  1.0000 -0.0135  1.0000
D10:A12  0.0170  0.0020  0.0170  0.0020
D10:C03  0.0456  0.0020  0.0458  0.0020
A12:C03  0.0284  0.0020  0.0287  0.0020

shuffle df


#shuffled_matrices <- replicate(n_rep, mat[sample(nrow(mat)), ], simplify = FALSE)
shuffled_matrices <- replicate(n_rep, mat[sample(length(mat), replace = FALSE)], simplify = FALSE)
##################
# shuffle only the genotype and add the pop column later for each matrices. 
#in the loop? 
###############


# Create a list to store the wc
fst_df <- numeric(sequence_length)
fis_df <- numeric(sequence_length)

# Calculate the average for each shuffled matrix

# Iterate through the shuffled matrices
for (i in 1:n_rep) {
  # Calculate the statistics for the i-th matrix
  #HERE THE COLUMN POP
  merged_df <- cbind(level_pop, shuffled_matrices[[i]])
  result_f_stats <- wc(shuffled_matrices[[i]]) 
  result_f_stats <- as.data.frame(result_f_stats$per.loc)
  # Extract FST and FIS values
  fst_values <- result_f_stats$FST
  fis_values <- result_f_stats$FIS
  print( fst_values)
  # Assign values to the data frames
  fst_df <- cbind(fst_df, result_f_stats$FST)
  fis_df <- cbind(fis_df, result_f_stats$FIS)
}

# Set row names as in result_f_stats

rownames(fst_df) <- rownames(fis_df) <- rownames(result_f_stats)
result_FST <- fst_df[, -1]
fis_df <-fis_df[, -1]
vec <- seq(1, n_rep)
colnames(result_FST) <- colnames(fis_df) <- vec


result_FST[1,] 

count (result_f_stats[,1][1] > result_FST[1,] )
count <- sum(result_f_stats[,1][1] > result_FST[1, ])



# Initialize an empty data frame to store the counts
count_df <- data.frame(
  Greater = numeric(length(result_FST)),
  Smaller = numeric(length(result_FST))
)

# Compare the values in result_f_stats[1] to result_FST for each column
for (col in colnames(result_FST)) {
  greater_count <- sum(result_f_stats[1] > result_FST[, col])
  smaller_count <- sum(result_f_stats[1] < result_FST[, col])
  count_df$Greater[col] <- greater_count
  count_df$Smaller[col] <- smaller_count
}

# Print the count data frame
print(count_df)

######################## ######################## 

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKIyBQYXJhbWV0ZXJzIAoKYGBge3J9CmZpbHRlcmVkX2RhdGEgPC0gcmVhZC5jc3YoImRhdGEvZGF0YS0yMDIzLTA5LTExICgyKS5jc3YiLCBoZWFkZXIgPSBUUlVFKQoKc2VsZWN0ZWRfc3RhdHMgPC0gYygiSG8iLCAiSHMiLCAiSHQiLCAiRmlzIChXJkMpIiwgIkZzdCAoVyZDKSIsICJGaXMgKE5laSkiLCAiRnN0IChOZWkpIgopCgpuX3JlcD0xMAoKbl9wb3AgPSA4CgpzZXF1ZW5jZV9sZW5ndGggPC0gbGVuZ3RoKDY6MTEpIApgYGAKCgoKIyBkYXRhIGZpbHRlcmluZyBjb252ZXJ0aW9uCgpgYGB7cn0KbGlicmFyeShoaWVyZnN0YXQpCmxpYnJhcnkoYWRlZ2VuZXQpCmZpbHRlcmVkX2RhdGEgPC0gZGF0YS5mcmFtZShpbmR2ID0gcGFzdGUoc3Vic3RyKGZpbHRlcmVkX2RhdGEkUG9wdWxhdGlvbiwxLDMpLCByb3cubmFtZXMoZmlsdGVyZWRfZGF0YSksIHNlcD0iLiIpLCBmaWx0ZXJlZF9kYXRhKQojIENyZWF0ZSBteWRhdGFfZ2VuaW5kCnBvcHVsYXRpb24gPC0gZmlsdGVyZWRfZGF0YSRQb3B1bGF0aW9uCm15ZGF0YV9nZW5pbmQgPC0gZGYyZ2VuaW5kKAogIFggPSBmaWx0ZXJlZF9kYXRhWyw2OjExXSwKICBzZXAgPSAiLyIsCiAgbmNvZGUgPSA2LAogIGluZC5uYW1lcyA9IGZpbHRlcmVkX2RhdGEkaW5kdiwKICBwb3AgPSBmaWx0ZXJlZF9kYXRhJFBvcHVsYXRpb24sCiAgTkEuY2hhciA9ICIwLzAiLAogIHBsb2lkeSA9IDIsCiAgdHlwZSA9ICJjb2RvbSIsCiAgc3RyYXRhID0gTlVMTCwKICBoaWVyYXJjaHkgPSBOVUxMCikKbXlkYXRhX2dlbmluZApteWRhdGFfaGllcmZzdGF0IDwtIGdlbmluZDJoaWVyZnN0YXQobXlkYXRhX2dlbmluZCkKYGBgCgoKCiMgUnVuIGJhc2ljLnN0YXRzIGFuZCByZW5kZXIgdGhlIHJlc3VsdAoKYGBge3J9CmxpYnJhcnkocGVnYXMpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGliYmxlKQoKcmVzdWx0IDwtIGJhc2ljLnN0YXRzKG15ZGF0YV9oaWVyZnN0YXQpCmRmX3Jlc3V0bF9iYXNpYzwtYXMuZGF0YS5mcmFtZShyZXN1bHQkcGVybG9jKQoKIyBXZWlyIGFuZCBDb2NrcmhhbSBlc3RpbWF0ZXMgb2YgRnN0YXRpc3RpY3MgLSBGSVMgYW5kIEZTVCAKcmVzdWx0X2Zfc3RhdHMgPC0gRnN0KGFzLmxvY2kobXlkYXRhX2dlbmluZCksIG5hLmFsbGVsZXMgPSAiIikKcmVzdWx0X2Zfc3RhdHMgPC0gcmVzdWx0X2Zfc3RhdHNbLDI6M10KY29sbmFtZXMocmVzdWx0X2Zfc3RhdHMpIDwtIGMoIkZzdCAoVyZDKSIsICJGaXMgKFcmQykiKQpyZXN1bHRfZl9zdGF0cyA8LSBtZXJnZShyZXN1bHRfZl9zdGF0cywgZGZfcmVzdXRsX2Jhc2ljLCBieT0icm93Lm5hbWVzIixhbGwueD1UUlVFKQpjb2xuYW1lcyhyZXN1bHRfZl9zdGF0cylbMTBdIDwtICJGc3QgKE5laSkiCmNvbG5hbWVzKHJlc3VsdF9mX3N0YXRzKVsxMl0gPC0gIkZpcyAoTmVpKSIKcmVzdWx0X2Zfc3RhdHMgPC0gcmVzdWx0X2Zfc3RhdHMgJT4lIGNvbHVtbl90b19yb3duYW1lcyguLCB2YXIgPSAnUm93Lm5hbWVzJykKcmVzdWx0X2Zfc3RhdHNfc2VsZWMgPC0gcmVzdWx0X2Zfc3RhdHMgJT4lIHNlbGVjdChhbGxfb2Yoc2VsZWN0ZWRfc3RhdHMpKQpyZXN1bHRfZl9zdGF0c19zZWxlYwpgYGAKCiMgRy1zdGF0aXN0aWMKCmBgYHtyfQpsaWJyYXJ5KGhyYnJ0aGVtZXMpCmxpYnJhcnkoZ2dwbG90MikKCiMgY29tcHV0ZSB0aGUgR3N0YXRzCnJlc3VsdF9mX3N0YXRzIDwtIHJlc3VsdF9mX3N0YXRzICU+JSBtdXRhdGUoR1NUID0gMS1Icy9IdCkKcmVzdWx0X2Zfc3RhdHMgPC0gcmVzdWx0X2Zfc3RhdHMgJT4lIG11dGF0ZSgiR1NUJyciID0gKG5fcG9wKihIdC1IcykpLygobl9wb3AqSHMtSHQpKigxLUhzKSkpCnJlc3VsdF9mX3N0YXRzCgojIFBsb3Qgd2l0aCBsaW5lYXIgdHJlbmQKcDIgPC0gZ2dwbG90KHJlc3VsdF9mX3N0YXRzLCBhZXMoeD1HU1QsIHk9SHMpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9bG0gLCBjb2xvcj0icmVkIiwgc2U9RkFMU0UpICsKICB0aGVtZV9pcHN1bSgpCnAyCgpgYGAKCiMgTWlzc2luZyBkYXRhCgpgYGB7cn0KIyBMaWJyYXJpZXMKbGlicmFyeSgicG9wcHIiKQpsaWJyYXJ5KCJoZWF0bWFwbHkiKQoKbWlzc2luZ19kYXRhIDwtIGluZm9fdGFibGUobXlkYXRhX2dlbmluZCwgcGxvdCA9IEZBTFNFKQoKIyBNYXRyaXggZm9ybWF0Cm1hdCA8LSBhcy5tYXRyaXgobWlzc2luZ19kYXRhKQojIGhlYXRtYXAKcCA8LSBoZWF0bWFwbHkobWF0LCAKICAgICAgICAgICAgICAgZGVuZHJvZ3JhbSA9ICJub25lIiwKICAgICAgICAgICAgICAgeGxhYiA9ICIiLCB5bGFiID0gIiIsIAogICAgICAgICAgICAgICBtYWluID0gIiIsCiAgICAgICAgICAgICAgIHNjYWxlID0gImNvbHVtbiIsCiAgICAgICAgICAgICAgIG1hcmdpbnMgPSBjKDYwLDEwMCw0MCwyMCksCiAgICAgICAgICAgICAgIGdyaWRfY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICBncmlkX3dpZHRoID0gMC4wMDAwMSwKICAgICAgICAgICAgICAgdGl0bGVYID0gRkFMU0UsCiAgICAgICAgICAgICAgIGhpZGVfY29sb3JiYXIgPSBUUlVFLAogICAgICAgICAgICAgICBicmFuY2hlc19sd2QgPSAwLjEsCiAgICAgICAgICAgICAgIGxhYmVsX25hbWVzID0gYygiUG9wdWxhdGlvbiIsICJNYXJrZXIiLCAiVmFsdWUiKSwKICAgICAgICAgICAgICAgZm9udHNpemVfcm93ID0gOCwgZm9udHNpemVfY29sID0gOCwKICAgICAgICAgICAgICAgbGFiQ29sID0gY29sbmFtZXMobWF0KSwKICAgICAgICAgICAgICAgbGFiUm93ID0gcm93bmFtZXMobWF0KSwKICAgICAgICAgICAgICAgaGVhdG1hcF9sYXllcnMgPSB0aGVtZShheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpKQopCnAKYGBgCgoKCiMgSFcgLSBQYW5taXhpYQoKYGBge3J9CgoKbGlicmFyeSgicGVnYXMiKQoKaHcudGVzdChhcy5sb2NpKG15ZGF0YV9nZW5pbmQpLCBCID0gMTAwMCkKCgpsaWJyYXJ5KGdlbmVwb3ApCiNodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvZ2VuZXBvcC9nZW5lcG9wLnBkZgpnZW5lcG9wX0hXIDwtIHRlc3RfSFcoCiAgaW5wdXRGaWxlID0gImRhdGEvbXlkYXRhLmdlbmVwb3AudHh0IiwKICB3aGljaCA9ICJQcm9iYSIsCiAgb3V0cHV0RmlsZSA9ICIiLAogIHNldHRpbmdzRmlsZSA9ICIiLAogIGVudW1lcmF0aW9uID0gRkFMU0UsCiAgZGVtZW1vcml6YXRpb24gPSAxMDAwMCwKICBiYXRjaGVzID0gMjAsCiAgaXRlcmF0aW9ucyA9IDUwMDAsCiAgdmVyYm9zZSA9IGludGVyYWN0aXZlKCkKKQoKZ2VuZXBvcF9IV3RhYmxlIDwtIEhXdGFibGVfYW5hbHlzaXMoCiAgaW5wdXRGaWxlID0gImRhdGEvbXlkYXRhLmdlbmVwb3AudHh0IiwKICB3aGljaCA9ICJQcm9iYSIsCiAgc2V0dGluZ3NGaWxlID0gIiIsCiAgZW51bWVyYXRpb24gPSBGQUxTRSwKICBkZW1lbW9yaXphdGlvbiA9IDEwMDAwLAogIGJhdGNoZXMgPSAyMCwKICBpdGVyYXRpb25zID0gNTAwMCwKICB2ZXJib3NlID0gaW50ZXJhY3RpdmUoKQopCmBgYAoKCgojIExpbmthZ2UgRGlzZXF1aWxpYnJpdW0KCmBgYHtyfQoKTEQoYXMubG9jaShteWRhdGFfZ2VuaW5kJHRhYiksIGxvY3VzID0gYygxLCAyKSwgZGV0YWlscyA9IFRSVUUpCgphPC1MRHNjYW4oYXMubG9jaShteWRhdGFfaGllcmZzdGF0WywyOjddKSkKCkxEbWFwKGEpCgoKaGVhZChteWRhdGFfaGllcmZzdGF0WywyOjddKQoKCmxpYnJhcnkocmFkaWF0b3IpCiNodHRwczovL3RoaWVycnlnb3NzZWxpbi5naXRodWIuaW8vcmFkaWF0b3IvcmVmZXJlbmNlL2dlbm9taWNfY29udmVydGVyLmh0bWwKI2h0dHBzOi8vdGhpZXJyeWdvc3NlbGluLmdpdGh1Yi5pby9yYWRpYXRvci9hcnRpY2xlcy9yYWRfZ2Vub21pY3NfY29tcHV0ZXJfc2V0dXAuaHRtbAoKbXlkYXRhMSA8LSBnZW5vbWljX2NvbnZlcnRlcihteWRhdGFfZ2VuaW5kLCBwYXJhbGxlbC5jb3JlID0gcGFyYWxsZWw6OmRldGVjdENvcmVzKCkgLSAxLCBvdXRwdXQgPSAiZ2VuZXBvcCIsIGZpbGVuYW1lID0gIi4uL2RhdGEvbXlkYXRhLmdlbmVwb3AudHh0IikKbXlkYXRhMSA8LSB0aWR5X2dlbmluZChteWRhdGFfZ2VuaW5kLCB0aWR5ID0gVFJVRSwgd3JpdGUgPSBGQUxTRSwgdmVyYm9zZSA9IFRSVUUpCgpkZXRlY3RfYWxsX21pc3NpbmcoKQoKCmxpYnJhcnkoZ2VuZXBvcCkKCgp0ZXN0X0xEKAogIGlucHV0RmlsZSA9ICJkYXRhL215ZGF0YS5nZW5lcG9wLnR4dCIsCiAgb3V0cHV0RmlsZSA9ICIiLAogIHNldHRpbmdzRmlsZSA9ICIiLAogIGRlbWVtb3JpemF0aW9uID0gMTAwMDAsCiAgYmF0Y2hlcyA9IDEwMCwKICBpdGVyYXRpb25zID0gNTAwMCwKICB2ZXJib3NlID0gaW50ZXJhY3RpdmUoKQopCgojRnN0KAojICBpbnB1dEZpbGUgPSAiZGF0YS9teWRhdGEuZ2VuZXBvcC50eHQiLAojICBzaXplcyA9IEZBTFNFLAojICBwYWlycyA9IEZBTFNFLAojICBvdXRwdXRGaWxlID0gIiIsCiMgIGRhdGFUeXBlID0gIkRpcGxvaWQiLAojICB2ZXJib3NlID0gaW50ZXJhY3RpdmUoKQojKQoKbGlicmFyeSgicG9wcHIiKSAKcGFpci5pYShteWRhdGFfZ2VuaW5kLCBzYW1wbGUgPSA1MDAsIHF1aWV0ID0gRkFMU0UsIG1ldGhvZCA9IDMgKQojIHdvcmtpbmcgYnV0IGRpZmZlcmVudCB2YWx1ZXMKCmBgYAoKCiMgc2h1ZmZsZSBkZgoKYGBge3J9Cgojc2h1ZmZsZWRfbWF0cmljZXMgPC0gcmVwbGljYXRlKG5fcmVwLCBtYXRbc2FtcGxlKG5yb3cobWF0KSksIF0sIHNpbXBsaWZ5ID0gRkFMU0UpCnNodWZmbGVkX21hdHJpY2VzIDwtIHJlcGxpY2F0ZShuX3JlcCwgbWF0W3NhbXBsZShsZW5ndGgobWF0KSwgcmVwbGFjZSA9IEZBTFNFKV0sIHNpbXBsaWZ5ID0gRkFMU0UpCiMjIyMjIyMjIyMjIyMjIyMjIwojIHNodWZmbGUgb25seSB0aGUgZ2Vub3R5cGUgYW5kIGFkZCB0aGUgcG9wIGNvbHVtbiBsYXRlciBmb3IgZWFjaCBtYXRyaWNlcy4gCiNpbiB0aGUgbG9vcD8gCiMjIyMjIyMjIyMjIyMjIwoKCiMgQ3JlYXRlIGEgbGlzdCB0byBzdG9yZSB0aGUgd2MKZnN0X2RmIDwtIG51bWVyaWMoc2VxdWVuY2VfbGVuZ3RoKQpmaXNfZGYgPC0gbnVtZXJpYyhzZXF1ZW5jZV9sZW5ndGgpCgojIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBmb3IgZWFjaCBzaHVmZmxlZCBtYXRyaXgKCiMgSXRlcmF0ZSB0aHJvdWdoIHRoZSBzaHVmZmxlZCBtYXRyaWNlcwpmb3IgKGkgaW4gMTpuX3JlcCkgewogICMgQ2FsY3VsYXRlIHRoZSBzdGF0aXN0aWNzIGZvciB0aGUgaS10aCBtYXRyaXgKICAjSEVSRSBUSEUgQ09MVU1OIFBPUAogIG1lcmdlZF9kZiA8LSBjYmluZChsZXZlbF9wb3AsIHNodWZmbGVkX21hdHJpY2VzW1tpXV0pCiAgcmVzdWx0X2Zfc3RhdHMgPC0gd2Moc2h1ZmZsZWRfbWF0cmljZXNbW2ldXSkgCiAgcmVzdWx0X2Zfc3RhdHMgPC0gYXMuZGF0YS5mcmFtZShyZXN1bHRfZl9zdGF0cyRwZXIubG9jKQogICMgRXh0cmFjdCBGU1QgYW5kIEZJUyB2YWx1ZXMKICBmc3RfdmFsdWVzIDwtIHJlc3VsdF9mX3N0YXRzJEZTVAogIGZpc192YWx1ZXMgPC0gcmVzdWx0X2Zfc3RhdHMkRklTCiAgcHJpbnQoIGZzdF92YWx1ZXMpCiAgIyBBc3NpZ24gdmFsdWVzIHRvIHRoZSBkYXRhIGZyYW1lcwogIGZzdF9kZiA8LSBjYmluZChmc3RfZGYsIHJlc3VsdF9mX3N0YXRzJEZTVCkKICBmaXNfZGYgPC0gY2JpbmQoZmlzX2RmLCByZXN1bHRfZl9zdGF0cyRGSVMpCn0KCiMgU2V0IHJvdyBuYW1lcyBhcyBpbiByZXN1bHRfZl9zdGF0cwoKcm93bmFtZXMoZnN0X2RmKSA8LSByb3duYW1lcyhmaXNfZGYpIDwtIHJvd25hbWVzKHJlc3VsdF9mX3N0YXRzKQpyZXN1bHRfRlNUIDwtIGZzdF9kZlssIC0xXQpmaXNfZGYgPC1maXNfZGZbLCAtMV0KdmVjIDwtIHNlcSgxLCBuX3JlcCkKY29sbmFtZXMocmVzdWx0X0ZTVCkgPC0gY29sbmFtZXMoZmlzX2RmKSA8LSB2ZWMKCgpyZXN1bHRfRlNUWzEsXSAKCmNvdW50IChyZXN1bHRfZl9zdGF0c1ssMV1bMV0gPiByZXN1bHRfRlNUWzEsXSApCmNvdW50IDwtIHN1bShyZXN1bHRfZl9zdGF0c1ssMV1bMV0gPiByZXN1bHRfRlNUWzEsIF0pCgoKCiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBkYXRhIGZyYW1lIHRvIHN0b3JlIHRoZSBjb3VudHMKY291bnRfZGYgPC0gZGF0YS5mcmFtZSgKICBHcmVhdGVyID0gbnVtZXJpYyhsZW5ndGgocmVzdWx0X0ZTVCkpLAogIFNtYWxsZXIgPSBudW1lcmljKGxlbmd0aChyZXN1bHRfRlNUKSkKKQoKIyBDb21wYXJlIHRoZSB2YWx1ZXMgaW4gcmVzdWx0X2Zfc3RhdHNbMV0gdG8gcmVzdWx0X0ZTVCBmb3IgZWFjaCBjb2x1bW4KZm9yIChjb2wgaW4gY29sbmFtZXMocmVzdWx0X0ZTVCkpIHsKICBncmVhdGVyX2NvdW50IDwtIHN1bShyZXN1bHRfZl9zdGF0c1sxXSA+IHJlc3VsdF9GU1RbLCBjb2xdKQogIHNtYWxsZXJfY291bnQgPC0gc3VtKHJlc3VsdF9mX3N0YXRzWzFdIDwgcmVzdWx0X0ZTVFssIGNvbF0pCiAgY291bnRfZGYkR3JlYXRlcltjb2xdIDwtIGdyZWF0ZXJfY291bnQKICBjb3VudF9kZiRTbWFsbGVyW2NvbF0gPC0gc21hbGxlcl9jb3VudAp9CgojIFByaW50IHRoZSBjb3VudCBkYXRhIGZyYW1lCnByaW50KGNvdW50X2RmKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKCmBgYAoKCgojCgpgYGB7cn0KCgpgYGAKCiMKCmBgYHtyfQoKCmBgYAoKIwoKYGBge3J9CgoKYGBgCgojCgpgYGB7cn0KCgpgYGAKCiMKCmBgYHtyfQoKCmBgYAoKIwoKYGBge3J9CgoKYGBgCgojCgpgYGB7cn0KCgpgYGAKCiMKCmBgYHtyfQoKCmBgYAo=